import numpy as np
import pandas as pd

# ⚫ Pandas 的索引分为显式索引与隐式索引。显式索引是使用 Pandas 对象提
# 供的索引，而隐式索引是使用数组本身自带的从 0 开始的索引。
# ⚫ 现假设某演示代码中的索引是整数，这个时候显式索引和隐式索引可能
# 会出乱子。于是，Pandas 作者发明了索引器 loc（显式）与 iloc（隐式），
# 手动告诉程序自己这句话是显式索引还是隐式索引。


# 2.1 一维对象的索引

# # （1）访问元素
# # 创建 sr
# v1 = [53, 64, 72, 82]
# k1 =  ['1 号', '2 号', '3 号', '4 号']
# sr1 = pd.Series(v1, k1)
# print(sr1)
# # 访问元素
# print("访问元素")
# print(sr1.loc['1 号'])
# print(sr1.iloc[0])
# # 花式索引
# print("# 花式索引")
# print(sr1.loc[['1 号', '3 号']])
# print(sr1.iloc[[0, 2]])
# # 修改元素
# print("# 修改元素")
# sr1.loc['4 号'] = 999
# print(sr1)
# sr1.iloc[1] = 888
# print(sr1)


# # （2）访问切片
# # 创建 sr
# v2 = [ 53, 64, 72, 82 ]
# k2 = ['1 号', '2 号', '3 号', '4 号']
# sr2 = pd.Series( v2, index=k2 )
# # 访问切片
# print("# 访问切片")
# print(sr2.loc['1 号': "2 号"])
# print(sr2.iloc[0:1])
# # 切片仅是视图
# # “赋值”符号不会新建对象
# print("# 切片仅是视图")
# cut21 = sr2.loc["1 号":"3 号"]
# cut21.loc["1 号"] = 100
# print(sr2)
# cut22 = sr2.iloc[0: 2]
# cut22.iloc[1] = 999
# print(sr2)
# # 对象赋值仅是绑定
# # “赋值”符号不会新建对象
# print("# 对象赋值仅是绑定")
# tem21  = sr2
# tem21.loc["4 号"] = 888
# print(sr2)
# tem22 = sr2
# tem22.iloc[1] = 666
# print(sr2)



# 2.2 二维对象的索引

# # （1）访问元素
# i = [ '1 号', '2 号', '3 号', '4 号' ]
# v1 = [ 53, 64, 72, 82 ]
# v2 = [ '女', '男', '男', '女' ]
# sr1 = pd.Series( v1, index=i )
# sr2 = pd.Series( v2, index=i )
# df = pd.DataFrame( { '年龄':sr1, '性别':sr2 } )
# print(df)
# # 访问元素
# print("# 访问元素")
# print(df.loc['1 号', '年龄'])
# print(df.iloc[0, 0])
# # 花式索引
# print("# 花式索引")
# print(df.loc[ ['1 号', '3 号'] , ['性别','年龄'] ])
# print(df.iloc[[0, 2], [1, 0]])
# # 修改元素
# print("# 修改元素")
# df.loc[ '3 号', '年龄' ] = 100
# df.iloc[2, 1] = 999
# print(df)

# （2）访问切片
# 数组创建法
v = [ [53, '女'], [64, '男'], [72, '男'], [82, '女'] ]
i = [ '1 号', '2 号', '3 号', '4 号' ]
c = [ '年龄', '性别' ]
df = pd.DataFrame( v, index=i, columns=c )
print(df)
# 切片
print("# 切片")
print(df.loc[ '1 号':'3 号' , '年龄' ])# 显式的含最后的编号
print(df.iloc[0:3, 0])# 隐式的不含最后的编号
# 提取二维对象的行
print("# 提取二维对象的行")
print(df.loc[ '3 号' , : ])
print(df.iloc[2, :])
# 提取矩阵对象的列
print("# 提取矩阵对象的列")
print(df.loc[ : , '年龄' ])
print(df.iloc[:, 0])
